#!/usr/local/python3/bin/python3.8
# -*- encoding: utf-8 -*-
'''
@File    :   装饰器.py
@Contact :   tt_candy@outlook.com
@License :   仅供非生产环境使用
@Desciption: None
@Creation time：20/12/22 6:40

@Modify Time      @Author    @Version    @Modify action
------------      -------    --------    -----------
   None           ttcandy      1.0         None  
'''

#无装饰器
def wrapper(func):
    def inner(*args,**kwargs):
        '''
        执行被装饰函数前
        '''
        func(*args,**kwargs)
    return inner

def foo():
    print(111)

foo=wrapper(foo)		#foo 赋值 inner()函数
foo()					#相当于调用了inner()函数
print(foo)				#print()可以看到foo本身是inner函数

###############################
#使用装饰器
def wrapper(func):
    def inner(*args,**kwargs):
        func(*args,**kwargs)
    return inner

@wrapper			#定义装饰器的语法
def foo():
    print(111)

foo()
print(foo)

###########################################################################
#有参数装饰器
def auth(arg):      # arg == True
    def wrapper(func):      #func 接收的是被装饰的函数  func == foo
        def inner(*args,**kwargs):      #*args,**kwargs被装饰函数需要的参数
             ret=func(*args,**kwargs)
             return ret     #ret是被装饰函数返回值 ret ==None
        return inner
    return wrapper

@auth(False)        #需要传入一个值使auth(True/False) 有意义才能被执行,相当于 foo=auth(False)(foo)
def foo(a):
    print(a)

foo(3123)
print(foo)

##########################################################################
#函数嵌套装饰器
def a(ii):
    def b(yy):
        """
        以下是装饰器。外层只是函数
        """
        def auth(arg):      # arg == True
            def wrapper(func):      #func 接收的是被装饰的函数  func == foo
                def inner(*args,**kwargs):      #*args,**kwargs被装饰函数需要的参数
                     ret=func(*args,**kwargs)
                     return ret     #ret是被装饰函数返回值 ret ==None
                return inner
            return wrapper

        return auth
    return b

# f = a(5)
# auth=f(10)
dd=a("5")("10")       #调用时需要定义外层函数
print(dd)        ##dd此时相当于auth()函数
@dd(True)        #需要传入一个值使auth(True/False) 有意义才能被执行,相当于 foo=auth(False)(foo)
def foo(a):
    print(a)

foo(3123)
print(foo)

##################################################################################
#多个函数装饰一个函数
def wrapper(func):
    def inner(*args, **kwargs):
        print("wrapper start")
        ret = func(*args, **kwargs)
        print("wrapper stop")
        return ret
    return inner

def wrapper1(func):
    def inner1(*args, **kwargs):
        print("wrapper1 start")
        ret1 = func(*args, **kwargs)
        print("wrapper1 stop")
        return ret1
    return inner1

@wrapper
@wrapper1
def fooc():
    print("is fooc")

fooc()